package cn.ihrm.sass.service;


import cn.ihrm.sass.dao.RoleDao;
import cn.ihrm.sass.dao.UserDao;
import cn.ihrm.sass.entity.system.Role;
import cn.ihrm.sass.entity.system.User;
import cn.utils.IdWorker;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import java.util.*;

@Service
public class UserService {
    @Autowired
    private UserDao userDao;
    @Autowired
    private RoleDao roleDao;

    @Autowired
    private IdWorker idWorker;

    /**
     * 保存用户
     * 1.配置idwork到工程
     * 2.在service中注入idwork
     * 3.通过idwork生成id
     * 4.保存企业
     */
    public void add(User user) {
        //基本属性的设置
        //使用雪花算法生成id
        String id = idWorker.nextId() + "";
        user.setId(id);
        //默认的状态
        user.setPassword("123456");
        user.setCreateTime(new Date());
        user.setEnableState(1);
        userDao.save(user);
    }

    /**
     * 更新用户
     * 1.参数：User
     * 2.根据id查询企业对象
     * 3.设置需要修改的属性
     * 4.调用dao完成更新
     */
    public void update(User user) {
        //先 查询再更新

        // id可能为空  进行判空操作

        //根据id查询到 company信息
        User temp = userDao.findById(user.getId()).get();
        // 获得名字
        temp.setUsername(user.getUsername());
        temp.setPassword(user.getPassword());
        temp.setDepartmentId(user.getDepartmentId());
        temp.setDepartmentName(user.getDepartmentName());

        userDao.save(temp);
    }


    /**
     * 删除用户
     */
    public void deleteById(String id) {
        userDao.deleteById(id);
    }

    /**
     * 根据id查询用户
     */
    public User findById(String id) {
        // 固定写法
        User user = userDao.findById(id).get();
        return user;
    }

    /**
     * 查询所有用户列表
     * 参数：
     * hasDept:
     * departmentId:
     * companyId:
     * 分页查询
     */
    public Page<User> findAll(Map<String, Object> map, int page,int size) {
        // 查询条件
        Specification<User> spec = new Specification<User>() {
            /**
             * 动态拼接查询条件
             * @param root
             * @param query
             * @param cb
             * @return
             */
            @Override
            public Predicate toPredicate(Root<User> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
                List<Predicate> list = new ArrayList<>();

                //判断
                // 根据请求的 companyId是否为空构造查询条件
                if (StringUtils.isEmpty(map.get("companyId"))) {
                    list.add(cb.equal(root.get("companyId").as(String.class), (String) map.get("companyId")));
                }
                // 根据请求的 departmentId 是否为空构造查询条件
                if (StringUtils.isEmpty(map.get("departmentId"))) {
                    list.add(cb.equal(root.get("departmentId").as(String.class), (String) map.get("departmentId")));
                }

                //根据请求的 hasDept 判断 是否分配部门 0 未分配 ；1 已分配
                if (StringUtils.isEmpty(map.get("hasDept")) || "0".equals((String) map.get("hasDept"))) {
                    list.add(cb.isNull(root.get("departmentId")));
                } else {
                    list.add(cb.isNotNull(root.get("departmentId")));
                }

                // 拼接
                return cb.and(list.toArray(new Predicate[list.size()]));
            }
        };
        // 分页
        Page<User> pageUser = userDao.findAll(spec, new PageRequest(page-1, size));

        return pageUser;
    }

    /**
     * 分配角色方法
     * @param userId
     * @param roleIds
     */
    public void addRoles(String userId, List<String> roleIds) {
        User user = userDao.findById(userId).get();
        // 设置用户的角色集合
        Set<Role> set = new HashSet<>();
        for(String roleId: roleIds){
            cn.ihrm.sass.entity.system.Role role = roleDao.findById(roleId).get();
            set.add(role);
        }
        // 设置用户和角色集合的关系
        user.setRoles(set);

        userDao.save(user);
    }

    /**
     * 通过手机号查询用户
     * @param mobile
     * @return
     */
    public User findByMobile(String mobile) {
       return userDao.findByMobile(mobile);
    }
}
